﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using Dapper;
using ProjetoSolo.QueroGas.Dominio.Entidades;
using ProjetoSolo.QueroGas.Dominio.Repositorios;
using ProjetoSolo.QueroGas.Infraestrutura.PersistenciaAdo.Extensions;

namespace ProjetoSolo.QueroGas.Infraestrutura.PersistenciaAdo.Repositorios
{
    public class RepositorioEndereco : IRepositorioEndereco
    {
        private readonly ContextoAdo contexto;

        public RepositorioEndereco(IContextoRepositorio contexto)
        {
            this.contexto = (ContextoAdo) contexto;
        }

        public int Cadastrar(Endereco endereco)
        {
            StringBuilder query = new StringBuilder();
            query.Append("insert into Endereco (Complemento, Cep, Estado, Bairro, Cidade, Logradouro, Ativo) output inserted.IdEndereco ");
            query.Append("values(@Complemento, @Cep, @Estado, @Bairro, @Cidade, @Logradouro, @Ativo)");

            return this.contexto.Conexao.Query<int>(query.ToString(), endereco, this.contexto.Transacao()).First();          
        }

        public IEnumerable<string> BuscarEstados()
        {
            StringBuilder query = new StringBuilder();
            query.Append("select distinct Endereco.Estado from Endereco inner join Empresa on Empresa.Endereco_IdEndereco = Endereco.IdEndereco ");
            query.Append("where Empresa.Ativo = 1");

            return this.contexto.Conexao.Query<String>(query.ToString());
        }

        public IEnumerable<string> BuscarCidadesPorEstado(string estado)
        {
            StringBuilder query = new StringBuilder();
            query.Append("select distinct Endereco.Cidade from Endereco inner join Empresa on Empresa.Endereco_IdEndereco = Endereco.IdEndereco ");
            query.Append("where Endereco.Estado = @estado and Empresa.Ativo = 1");

            return this.contexto.Conexao.Query<String>(query.ToString(), new {estado});
        }

        public IEnumerable<string> BuscarBairrosPorEstadoCidade(string estado, string cidade)
        {
            StringBuilder query = new StringBuilder();
            query.Append("select distinct Endereco.Bairro from Endereco inner join Empresa on Empresa.Endereco_IdEndereco = Endereco.IdEndereco ");
            query.Append("where Endereco.Estado = @estado and Endereco.Cidade = @cidade and Empresa.Ativo = 1");

            return this.contexto.Conexao.Query<String>(query.ToString(), new { estado, cidade });
        }

        public Endereco PegarPorCodigo(int codigo)
        {
            throw new NotImplementedException();
        }

        public IEnumerable<Endereco> PegarListaCompleta()
        {
            throw new NotImplementedException();
        }
        public IEnumerable<Endereco> BuscarBairrosECidades()
        {
            var query = new StringBuilder();
            query.Append(
                "select distinct '' Bairro, Endereco.Cidade from Endereco " +
                "inner join Empresa on Empresa.Endereco_IdEndereco = Endereco.IdEndereco " +
                "where Empresa.Ativo = 1 " +
                "union " +
                "select distinct Endereco.Bairro, Endereco.Cidade from Endereco " +
                "inner join Empresa on Empresa.Endereco_IdEndereco = Endereco.IdEndereco " +
                "where Empresa.Ativo = 1;"
            );

            return this.contexto.Conexao.Query<Endereco>(query.ToString());
        }
    }
}
